package com.rui.study.algorithm.P_八皇后;
//
//import com.rui.study.commons.util.RandomUtil;
//
//import java.util.Arrays;
//
///**
// * @program: study_20180824
// * @description: 主类
// * @author: Yaowr
// * @create: 2018-08-31 17:19
// **/
public class 八皇后 {

    public static void main(String[] args) {
        int result = new N皇后_提交_2().totalNQueens(4);
        System.out.println(result);
    }
//
//    private static final String QUEEN = "O";
//    private static final String EMPTY = " ";
//    private static final String NAN = "X";
//
//    public static void main(String[] args) {
//        // 皇后个数
//        int n = RandomUtil.nextInt(4, 5);
//
//        /* 初始化棋盘 */
//        String[][] board = new String[n][n];
//        for (int i = 0; i < n; i++) {
//            Arrays.fill(board[i], EMPTY);
//        }
//
//        board[0][0] = QUEEN;
//
//        // 摆放皇后
//        locate(board);
//
//        // 打印结果
//        markEnable(board);
//        print(board);
//    }
//
//    /**
//     * 递归落子
//     * @param board
//     * @return
//     */
//    public static int locate(String[][] board) {
//        if (board == null)
//            return 0;
//        int n = board.length;
//
//        // 皇后数量
//        int count = 0;
//
//        /* 皇后位置校验 */
//        for (int x = 0; x < n; x++) {
//            for (int y = 0; y < n; y++) {
//                if (board[x][y].equals(QUEEN)) {
//                    count++;
//                    markDisable(board, x, y);
//                }
//            }
//        }
////        if (count == n)
////            return true;    // 返回皇后数量
//
//        /* 遍历落子位置 */
//        for (int x = 0; x < n; x++) {
//            for (int y = 0; y < n; y++) {
//                if (!board[x][y].equals(EMPTY))     // 寻找空位置
//                    continue;
//                // 摆'当前皇后'
//                board[x][y] = QUEEN;
//                // 摆'下一个皇后'
//                count = locate(board);
//                // 皇后数量够数！
//                if (count > n) {
//                    // 打印结果
//                    markEnable(board);
//                    print(board);
//                } else {
//                    // '当前皇后'位置不符合规定，去掉
//                    board[x][y] = EMPTY;
//                    markEnable(board);
//                    // 复盘
//                    markDisable(board);
//                }
//            }
//        }
//
//        return count;
//    }
//
//    private static void markDisable(String[][] board, int xLocation, int yLocation) {
//        mark(board, xLocation, yLocation, NAN);
//    }
//
//    private static void markDisable(String[][] board) {
//        if (board == null)
//            return;
//        int n = board.length;
//
//        for (int x = 0; x < n; x++) {
//            for (int y = 0; y < n; y++) {
//                if (board[x][y].equals(QUEEN)) {
//                    markDisable(board, x, y);
//                }
//            }
//        }
//    }
//
//    private static void markEnable(String[][] board) {
//        if (board == null)
//            return;
//        int n = board.length;
//
//        for (int x = 0; x < n; x++) {
//            for (int y = 0; y < n; y++) {
//                if (board[x][y].equals(NAN)) {
//                    board[x][y] = EMPTY;
//                }
//            }
//        }
//    }
//
//    /**
//     * 指定'皇后'位置，标记或取消不可用位置
//     * @param board
//     * @return
//     */
//    private static void mark(String[][] board, int xLocation, int yLocation, String flag) {
//        if (board == null)
//            return;
//        int n = board.length;
//
//        // 行
//        for (int y = 0; y < n; y++) {
//            if (y != yLocation) {
//                board[xLocation][y] = flag;
//            }
//        }
//
//        // 列
//        for (int x = 0; x < n; x++) {
//            if (x != xLocation) {
//                board[x][yLocation] = flag;
//            }
//        }
//
//        // 对角
//        int startX = 0, startY = 0;
//        if (xLocation > yLocation) {
//            startX = xLocation - yLocation;
//        } else if (xLocation < yLocation) {
//            startY = yLocation - xLocation;
//        }
//        int beginX = xLocation + yLocation < n ? xLocation + yLocation : n - 1;
//        int beginY = xLocation + yLocation < n ? 0 : xLocation + yLocation - (n - 1);
//        for (int y = 0; y < n; y++) {
//            // 左
//            if (y >= beginY && beginX >= 0) {
//                if (y != yLocation) {
//                    board[beginX][y] = flag;
//                }
//                beginX--;
//            }
//            // 右
//            if (y >= startY && startX < n) {
//                if (y != yLocation) {
//                    board[startX][y] = flag;
//                }
//                startX++;
//            }
//        }
//    }
//
//
//    private static void print(String[][] board) {
//        if (board == null)
//            return;
//        int n = board.length;
//        for (int i = 0; i < n; i++) {
//            System.out.println(Arrays.toString(board[i]));
//        }
//        System.out.println();
//    }
//
}
